binary codes explained